package Noyau;

import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;

public abstract class CheminBagage extends Chemin implements InterfaceBagage
{
	protected List<Bagage> bagages = new ArrayList<Bagage> ();
	protected InterfaceBagage entree = null;
	protected InterfaceBagage sortie = null;


	@Override
	public List<Bagage> getBagages()  
	{
		return this.bagages;
	}

	@Override
	public InterfaceBagage getEntree() 
	{
		return this.entree;
	}

	@Override
	public void setEntree(InterfaceBagage value)
	{
		this.entree = value;		

		this.setChanged();
		this.notifyObservers();
	}

	@Override
	public InterfaceBagage getSortie() {		
		return this.sortie;
	}

	@Override
	public void setSortie(InterfaceBagage value)
	{
		this.sortie = value;
		value.setEntree(this);

		this.setChanged();
		this.notifyObservers();
	}

	@Override
	public List<Chemin> getNeighbors()
	{
		List<Chemin> result = new ArrayList<Chemin>();

		if (this.sortie != null)
		{
			result.add((Chemin)this.sortie);			
		}

		return result;
	}

	@Override
	public void CreerBagage(Bagage bagage) 
	{
		bagage.setParent(this);
		this.bagages.add(bagage);

		this.setChanged();
		this.notifyObservers();
	}

	@Override
	public double getAngle()
	{
		double result = 0;

		if (this.getVisualSize() == 0)
		{
			if (this.entree != null && this.sortie != null)
			{
				result = (this.entree.getAngle() + this.sortie.getAngle()) / 2;
			}
			else if (this.entree != null)
			{
				result = this.entree.getAngle();
			}
			else if (this.sortie != null)
			{
				result = this.sortie.getAngle();
			}
		}
		else
		{			
			if (this.entree != null)
			{				
				if (this.entree.getOrigine().equals(this.getOrigine()))
				{
					result = this.entree.getAngle();					
				}
				else
				{
					Point2D vecteur = new Point2D.Double(this.getOrigine().getX() - this.entree.getOrigine().getX(), this.getOrigine().getY() - this.entree.getOrigine().getY());				
					result = Math.atan2(vecteur.getY(), vecteur.getX()) + Math.PI;
				}
			}
		}

		return result;
	}

	@Override
	public List<ObjetMetier> getChildren()
	{
		List<ObjetMetier> children = new ArrayList<ObjetMetier>();

		children.addAll(this.bagages);

		return children;
	}
}
